# bash completion for GNU find. This makes heavy use of ksh style extended
# globs and contains Linux specific code for completing the parameter
# to the -fstype option.

have find &&
_find()
{
    local cur prev i exprfound onlyonce

    COMPREPLY=()
    cur=`_get_cword`
    prev=${COMP_WORDS[COMP_CWORD-1]}

    case "$prev" in
    -@(max|min)depth)
        COMPREPLY=( $( compgen -W '0 1 2 3 4 5 6 7 8 9' -- "$cur" ) )
        return 0
        ;;
    -?(a|c)newer|-fls|-fprint?(0|f)|-?(i)?(l)name|-?(i)wholename)
        _filedir
        return 0
        ;;
    -fstype)
        # this is highly non-portable
        [ -e /proc/filesystems ] &&
            COMPREPLY=( $( compgen -W "$( cut -d$'\t' -f2 /proc/filesystems )" \
            -- "$cur" ) )
        return 0
        ;;
    -gid)
        _gids
        return 0
        ;;
    -group)
        if [ -n "$bash205" ]; then
            COMPREPLY=( $( compgen -g -- $cur 2>/dev/null) )
        fi
        return 0
        ;;
    -?(x)type)
        COMPREPLY=( $( compgen -W 'b c d p f l s' -- "$cur" ) )
        return 0
        ;;
    -uid)
        _uids
        return 0
        ;;
    -user)
        COMPREPLY=( $( compgen -u -- "$cur" ) )
        return 0
        ;;
    -exec|-ok)
        COMP_WORDS=(COMP_WORDS[0] "$cur")
        COMP_CWORD=1
        _command
        return 0
        ;;
    -[acm]min|-[acm]time|-?(i)?(l)?(whole)name|-inum|-?(i)path|-?(i)regex| \
    -links|-perm|-size|-used|-printf)
        # do nothing, just wait for a parameter to be given
        return 0
        ;;
    esac

    _expand || return 0

    # set exprfound to 1 if there is already an expression present
    for i in ${COMP_WORDS[@]}; do
        [[ "$i" = [-\(\),\!]* ]] && exprfound=1 && break
    done

    # handle case where first parameter is not a dash option
    if [ "$exprfound" != 1 ] && [[ "$cur" != [-\(\),\!]* ]]; then
        _filedir -d
        return 0
    fi

    # complete using basic options
    COMPREPLY=( $( compgen -W '-daystart -depth -follow -help -maxdepth \
        -mindepth -mount -noleaf -version -xdev -amin -anewer \
        -atime -cmin -cnewer -ctime -empty -false -fstype \
        -gid -group -ilname -iname -inum -ipath -iregex \
        -wholename \
        -links -lname -mmin -mtime -name -newer -nouser \
        -nogroup -perm -regex -size -true -type -uid -used \
        -user -xtype -exec -fls -fprint -fprint0 -fprintf -ok \
        -print -print0 -printf -prune -ls -wholename -iwholename' -- "$cur" ) )

    # this removes any options from the list of completions that have
    # already been specified somewhere on the command line, as long as
    # these options can only be used once (in a word, "options", in
    # opposition to "tests" and "actions", as in the find(1) manpage).
    onlyonce=' -daystart -depth -follow -help -maxdepth -mindepth -mount \
       -noleaf -version -xdev '
    COMPREPLY=( $( echo "${COMP_WORDS[@]}" | \
           (while read -d ' ' i; do
            [ "$i" == "" ] ||
            [ "${onlyonce/ ${i%% *} / }" == "$onlyonce" ] &&
            continue
            # flatten array with spaces on either side,
            # otherwise we cannot grep on word boundaries of
            # first and last word
            COMPREPLY=" ${COMPREPLY[@]} "
            # remove word from list of completions
            COMPREPLY=( ${COMPREPLY/ ${i%% *} / } )
            done
            echo "${COMPREPLY[@]}")
          ) )

    _filedir

    return 0
} &&
complete -F _find $filenames find

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
